#include <iostream>

#if 0
void FreeArray(int *a, void (*freePtr)(void*))
{
    // 很多C语言里的函数，它要传很多的指针参数，但是这些指针参数又不都是必要的，那么这种情况只能传空
    // 这就导致在调用函数的时候，每次都写个空指针看着很突兀，代码不够精简和优雅
    if(freePtr == NULL)
        return;
    // for()
    free(a);
}

int main()
{
    int a[10];
    FreeArray(a, NULL); // 每次都写个空指针很突兀
    return 0;
}
#endif

#if 0
    // 于是引入了默认参数（给参数一个默认值）
    void FreeArray(int *a, void (*freePtr)(void*) = NULL)
    {
        if(freePtr == NULL)
            return;
        // for()
        free(a);
    }

    int main()
    {
        int a[10];
        FreeArray(a); // 这样一来，在调函数的时候就不需要去传这个参了
        return 0;
    }
#endif

#if 0
// 默认参数：调用函数时不传参就用默认值
// 1、默认参数必须都放在最右边
// 2、出现第一个默认参数时，后面都必须有默认参数

    int func(int a, int b, int c = 0) // 如果c不传值，就默认c取0，如果传值，那就把传的值给到c
    {
        return a + b + c;
    }

    int main()
    {
        std::cout<<func(1, 2)<<std::endl;   // 如果想实现两个数相加
        std::cout<<func(1, 2, 3)<<std::endl;

        return 0;
    }
#endif

#if 0
    int func(int a , int b = 0, int c) 
    {
        return a + b + c;
    }

    int main()
    {
        std::cout<<func(1, 2)<<std::endl;   // 这样就有歧义了

        return 0;
    }
#endif

#if 0
    // 默认参数定义在函数声明中时，定义中不能再出现默认参数
    int func(int a, int b = 0, int c = 0);  // 函数声明时定义了默认参数

    int func(int a, int b, int c)   //函数定义中就不能再出现默认参数
    {
        return a + b + c;
    }

    int main()
    {
        std::cout<<func(1)<<std::endl;
        std::cout<<func(1, 2)<<std::endl;
        std::cout<<func(1, 2, 3)<<std::endl;

        return 0;
    }
#endif

#if 1
    // 占位参数（伏笔——运算符重载）
    int func(int a, int)
    {

    }

    int main()
    {
        std::cout<<func(1, 2)<<std::endl;   //这个2传过去根本没人接，但是得传
        return 0;
    }
#endif

